home *** CD-ROM | disk | FTP | other *** search
/ World of Education / World of Education.iso / world_s / startrek.zip / STARTREK.BAS < prev   
BASIC Source File  |  1985-05-06  |  23KB  |  449 lines

  1. 10 PRINT CHR$(26) : PRINT " STARTREK VERSION 85-05-05" : ON ERROR GOTO 6000
  2. 20 PRINT : PRINT "By Joe Kasser" : PRINT : GOSUB 4500 : GOSUB 4660
  3. 30 PRINT : PRINT K9/100;"Klingons have invaded Federation territory" : PRINT
  4. 40 PRINT "Your mission is to destroy them in";T;"Stardates" : GOTO 3000
  5. 50 REM SUBROUTINE TO SET UP 2 RANDOM CO-ORDINATES
  6. 60 X=INT(RND(Z)*8) : Y=INT(RND(Z)*8) : RETURN
  7. 70 REM SUB TO PRINT HEADING
  8. 80 PRINT : PRINT D$(I);"AT QUADRANT";Q1+Z;",";Q2+Z : PRINT : RETURN 
  9. 90 REM SUBROUTINE TO SET UP ENTERPRISE PARAMETERS
  10. 100 E=E0 : E1=0 : P=10 : RETURN
  11. 110 REM SUBROUTINE TO DAMAGE SOMETHING
  12. 120 Y=Z+RND(Z)*W : X=INT((C1-C2)*RND(Z)) : D(X)=Y+D(X) : PRINT D$(X); "DAMAGED" : RETURN
  13. 130 REM ENERGY HIT SUBROUTINE
  14. 140 E1=E1-H : E=E-H : IF E1=<0 THEN F9=2 : GOTO 160
  15. 150 IF H>E1/2 THEN PRINT "SHIELD OVERLOAD ....."; : GOSUB 110
  16. 160 RETURN
  17. 170 REM SUBROUTINE TO PRINT SCORE
  18. 180 N=INT(((K8-K9)/100)*(K5/2.5+K4+Z)^2*100/(T9-T)) : IF N<0 THEN N=0
  19. 190 PRINT "SCORE";TAB(38);N : RETURN
  20. 200 REM MAP (COMPUTER) ROUTINE
  21. 210 I=5 : IF D(I)>0 THEN PRINT "COMPUTER DOWN AT THIS TIME " : GOTO 280
  22. 220 GOSUB 70 : FOR I=0 TO 7 : PRINT TAB((Z+I)*5);I+Z; : NEXT : PRINT : FOR I=0 TO 7 : PRINT I+Z ;
  23. 230 FOR J=0 TO 7 : PRINT " "; : IF I=Q1 AND J=Q2 AND Q(I,J)<0 THEN PRINT CHR$(8);"+***+"; : GOTO 270
  24. 240 IF Q(I,J)<0 THEN PRINT "*** "; : GOTO 270
  25. 250 E$=STR$(Q(I,J)) : E$=" 00"+MID$(E$,2) : : IF I=Q1 AND J=Q2 THEN PRINT CHR$(8);"+";RIGHT$(E$,3);"+";  : GOTO 270
  26. 260 PRINT RIGHT$(E$,3);" ";
  27. 270 NEXT J : PRINT : NEXT I
  28. 280 RETURN
  29. 300 REM LRS LONG RANGE SENSOR SCAN ROUTINE
  30. 310 IF D(I)>0 THEN PRINT D$(I); " DAMAGED" : GOTO 370
  31. 320 GOSUB 70 : FOR I=Q1-Z TO Q1+Z : FOR J=Q2-Z TO Q2+Z: PRINT " ";
  32. 330 IF I<0 OR I>7 OR J<0 OR J>7 THEN PRINT "***" ; : GOTO 360
  33. 340 IF D(5)=0 THEN Q(I,J)=ABS(Q(I,J))
  34. 350 E$=STR$(Q(I,J)) : E$="00"+MID$(E$,2) : PRINT RIGHT$(E$,3);
  35. 360 NEXT J : PRINT : NEXT I
  36. 370 RETURN
  37. 390 REM
  38. 400 REM SRS SHORT RANGE SENSORS
  39. 410 IF D(I)>0 THEN PRINT D$(I); " DAMAGED" : RETURN
  40. 420 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN 440
  41. 430 IF D(5)=0 THEN Q(Q1,Q2)=ABS(Q(Q1,Q2))
  42. 440 GOSUB 70 : GOSUB 3400 : PRINT "   1 2 3 4 5 6 7 8";TAB(20); : GOSUB 170  : FOR I=0 TO 7 : PRINT I+Z ;
  43. 450 FOR J=0 TO 7 : PRINT MID$(S$,S(I,J),Z); " ";: NEXT J : PRINT TAB(20) ;  
  44. 460 ON I+Z GOTO 470,480,490,500,510,520,530,540
  45. 470 PRINT "DAYS LEFT"; TAB(38);T : GOTO 550
  46. 480 PRINT "CONDITION "; TAB(38);C$ : GOTO 550
  47. 490 PRINT "SHIELDS"; TAB(38);E1 : GOTO 550
  48. 500 PRINT "ENERGY" ; TAB(38);E : GOTO 550
  49. 510 PRINT "PHOTON TORPEDOES";TAB(38);P : GOTO 550
  50. 520 PRINT "STARBASES";TAB(38);B9/10 : GOTO 550
  51. 530 PRINT "KLINGONS LEFT";TAB(38);K9/100 : GOTO 550
  52. 540 PRINT "KLINGONS CAPTURED";TAB(38);K4 : GOTO 550
  53. 550 NEXT I : RETURN
  54. 600 REM SHOOTBACK SUBROUTINE
  55. 610 IF C$="DOCKED" THEN 680 
  56. 620 FOR I=0 TO 7 : IF K3(I)<=0 OR RND(Z)<.1*(I+Z) THEN 670
  57. 630 IF RND(Z)>K3(I)/500 THEN PRINT "KLINGON TORPEDO"; : H=RND(Z)*E1 : E1=E1+H : E=E+H : GOTO 660
  58. 640 H=K3(I)*.4*RND(Z) : K3(I)=K3(I)-H : H=H/(SQR((K1(I)-S1)^2+(K2(I)-S2)^2))^.4
  59. 650 PRINT H;"Unit hit on Enterprise";
  60. 660 PRINT " from sector";K1(I)+Z;",";K2(I)+Z : GOSUB 130 : IF F9>0 THEN 680
  61. 670 NEXT : IF E1<100 THEN PRINT D$(6);" Dangerously low";CHR$(7)
  62. 680 RETURN
  63. 700 REM MOVE KLINGON ROUTINE
  64. 710 FOR I=0 TO 7 : IF K3(I)<=0 THEN 740
  65. 720 GOSUB 50 : IF S(X,Y)<>Z THEN 740
  66. 730 S(K1(I),K2(I))=Z : K1(I)=X : K2(I)=Y : S(X,Y)=4
  67. 740 NEXT : RETURN
  68. 800 REM PHA PHASERS
  69. 810 IF K=0 THEN PRINT "No targets in quadrant .......  sir " : GOTO 950
  70. 820 IF D(I)>0 THEN PRINT D$(I);"OUT OF ACTION SIR" : GOTO 950
  71. 830 IF D(1)>0 THEN PRINT D$(1);"are not working, will use best guess settings"
  72. 840 INPUT "READY- how much energy do you want to fire "; X : IF X<=0 THEN 950
  73. 850 IF X>(E-E1) THEN PRINT "We don't have that much energy available sir" : GOTO 840
  74. 860 E = E - X : Y = K : FOR I = 0 TO 7 : IF K3(I)<=0 THEN 940
  75. 870 IF D(1)>0 THEN X = X*RND(Z)
  76. 880 H = X/(Y*(SQR((K1(I)-S1)^2+(K2(I)-S2)^2)^.4)) : K3(I) = K3(I) - H
  77. 890 PRINT "Hit on KLINGON at";K1(I)+Z;",";K2(I)+Z; : IF D(1)=0 THEN PRINT "(";K3(I);"Units left)" ELSE PRINT
  78. 900 IF K3(I)<=0 THEN K3(I) = 0 : PRINT "KLINGON DESTROYED" : S(K1(I),K2(I)) = Z : GOSUB 1220 : GOTO 940
  79. 910 IF K>Z OR K3(I)>E1/100 OR RND(Z)>.4 THEN 940
  80. 920 K3(I)=0 : S(K1(I),K2(I))=Z : GOSUB 1220 : IF RND(Z)<.7 THEN PRINT "KLINGON EXPLODED" : K5=K5+Z : GOTO 940
  81. 930 PRINT "KLINGON SURRENDERS .....Boarding party away" : K4 = K4 + Z : T1 = T : T = T - .5 : GOSUB 1800
  82. 940 NEXT
  83. 950 RETURN
  84. 1000 REM TOR PHOTON TORPEDOES
  85. 1010 IF D(I) > 0 THEN PRINT "TUBES BLOCKED" : GOTO 1210
  86. 1020 IF P = 0 THEN PRINT "NO TORPEDOE's LEFT SIR !" : GOTO 1210
  87. 1030 INPUT "DIRECTION (1-9) ";C : IF C<1 OR C>9 THEN 1030
  88. 1040 Y1=S1+.5 : X1=S2+.5 : Y=(C-Z)*.785398 : X=COS(Y) : Y=-SIN(Y) : PRINT "TRACK" 
  89. 1050 P=P-Z : FOR J=0 TO E0 : Y1=Y1+Y : X1=X1+X : Y2=INT(Y1) : X2=INT(X1)
  90. 1060 IF X2<0 OR X2>7 OR Y2<0 OR Y2>7 THEN PRINT "MISSED" : GOTO 1210
  91. 1070 PRINT Y2+Z;",";X2+Z : ON S(Y2,X2) GOTO 1200,1080,1190,1100,1150
  92. 1080 PRINT "STAR "; : IF RND(Z)<.5 THEN PRINT "ABSORBED TORPEDO" : GOTO 1210
  93. 1090 PRINT "DEFLECTED TORPEDO" : Y=Z+RND(Z)*8*.785398 : X=COS(Y) : Y=-SIN(Y) : GOTO 1200
  94. 1100 IF RND(Z)>.9 THEN 1200
  95. 1110 PRINT " KLINGON DESTROYED"
  96. 1120 FOR I=0 TO 7 : IF Y2=K1(I) AND X2=K2(I) THEN 1140
  97. 1130 NEXT I : PRINT "SENSOR  MALFUNCTION";CHR$(7)
  98. 1140 K3(I)=0 : GOSUB 1220 :  GOTO 1180 
  99. 1150 PRINT " STARBASE DESTROYED, WELL DONE" : B=B-Z : B9=B9-10 : K8=K9 : T9=T+Z
  100. 1160 IF Q(Q1,Q2)<0 THEN Q(Q1,Q2)=Q(Q1,Q2)+10 ELSE Q(Q1,Q2)=Q(Q1,Q2)-10
  101. 1170 IF B9=0 THEN PRINT : PRINT "THAT WAS YOUR LAST STARBASE"
  102. 1180 S(Y2,X2)=Z : GOTO 1210
  103. 1190 PRINT CHR$(7);"EVASIVE ACTION ....missed us"
  104. 1200 NEXT J
  105. 1210 RETURN
  106. 1220 REM SUBROUTINE TO CLEAR KLINGON FROM SIMULATION
  107. 1230 K=K-Z : K9=K9-100 : IF K9=0 THEN F9=5
  108. 1240 IF Q(Q1,Q2)<0 THEN Q(Q1,Q2)=Q(Q1,Q2)+100 ELSE Q(Q1,Q2)=Q(Q1,Q2)-100
  109. 1250 RETURN
  110. 1300 REM NAV/WARP ENGINES/NAVIGATION 
  111. 1310 INPUT "DIRECTION PLEASE (1-9) ";C : IF C<1 OR C>9 THEN 1310
  112. 1320 INPUT "WARP FACTOR ";W : IF W=<0 THEN 1750
  113. 1330 IF W>8 THEN PRINT " SIR WE CANNA GO THAT FAST" : GOTO 1320
  114. 1340 IF D(0)=0 THEN 1360
  115. 1350 IF W>=Z THEN PRINT D$(I);"DAMAGED (maximum allowable=.9) " : GOTO 1320
  116. 1360 REM MOVE ON
  117. 1370 S(S1,S2)=Z : T1=T : IF K>0 AND W>=Z THEN GOSUB 600 : IF F9>0 THEN 1750
  118. 1380 Y1=S1+.5 : X1=S2+.5 : Y=(C-Z)*.785398 : X=COS(Y) : Y=-SIN(Y) 
  119. 1390 FOR I=0 TO INT(W*8) : T=T-.1 : Y1=Y1+Y : X1=X1+X : Y2=INT(Y1) : X2=INT(X1)
  120. 1400 IF X2<0 OR X2>7 OR Y2<0 OR Y2>7 THEN 1490
  121. 1410 ON S(Y2,X2) GOTO 1470,1420,1470,1440,1450
  122. 1420 PRINT "STAR DEAD AHEAD" : IF RND(Z)>.6 AND B=0 THEN 1640
  123. 1430 PRINT "EMERGENCY ENGINE SHUT DOWN" : D(0)=D(0)+.5 : GOSUB 1780 : GOTO 1720
  124. 1440 PRINT : PRINT "STAND BY FOR COLLISION WITH KLINGON" : GOSUB 1780 : GOSUB 110 : GOTO 1720
  125. 1450 GOSUB 1780 : PRINT : PRINT "MESSAGE FROM STARBASE" : IF K>0 THEN PRINT "CLUMSY" : GOTO 1720
  126. 1460 PRINT "ENTERPRISE CAUGHT IN TRACTOR BEAM BEFORE COLLISION" : GOTO 1720
  127. 1470 NEXT : S1=Y2 : S2=X2 : S(Y2,X2)=3 : GOTO 1580
  128. 1490 REM-OUT OF SECTOR
  129. 1500 Q1=INT(Q1+W*Y+(S1+.5)/8) : Q2=INT(Q2+W*X+(S2+.5)/8) : T=T-.6
  130. 1510 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN 1550
  131. 1520 REM INSIDE GALAXY
  132. 1530 IF G9=Z THEN GOSUB 1760 : G9=0 
  133. 1540 GOTO 1570
  134. 1550 IF G9=0 THEN GOSUB 1760 : G9=Z
  135. 1570 GOSUB 3200
  136. 1580 I=INT(RND(Z)*100) : IF I=0 OR I>4 THEN 1720
  137. 1590 IF G9=Z THEN 1680
  138. 1600 PRINT : IF B>0 THEN 1720
  139. 1610 ON I GOTO 1620,1640,1670,1680
  140. 1620 PRINT CHR$(7);"KLINGON SPACE MINE " : H=RND(Z)*400 : GOSUB 130 : IF F9>0 THEN 1750
  141. 1630 PRINT "SHIELDS DOWN TO"; E1; " UNITS" : GOTO 1720
  142. 1640 PRINT "SPACE WARP DUE TO GRAVITATIONAL ANOMALY" : GOSUB 50 : Q1=INT(X-P) : Q2=INT(Y-P)
  143. 1650 G9=0 : IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN G9=Z
  144. 1660 PRINT "SENSORS SHOW WE SEEM TO HAVE MOVED TO QUADRANT"; Q1+Z;",";Q2+Z : GOSUB 3200 : GOTO 1740
  145. 1670 PRINT CHR$(7);"ION STORM " : GOSUB 110 : GOTO 1720
  146. 1680 REM SPOCK DOES HIS FIXING HERE
  147. 1690 GOSUB 50 : FOR I=X TO C1-C2 : IF D(I)>0 THEN 1710
  148. 1700 NEXT : FOR I=0 TO X : IF D(I)<=0 THEN NEXT : GOTO 1720
  149. 1710 D(I)=0 : PRINT " Mr. SPOCK FIXED the ";D$(I)
  150. 1720 E=E-((INT(W*8))^2)/2 : IF E<0 THEN F9=3 : GOTO 1750
  151. 1730 GOSUB 1800 : IF E1>E THEN E1=E
  152. 1740 GOSUB 3400
  153. 1750 RETURN
  154. 1760 PRINT "CROSSING BARRIER at GALACTIC BOUNDARY" : GOSUB 110 : RETURN
  155. 1780 REM SUBROUTINE TO BACK UP ONE SECTOR
  156. 1790 S1=INT(Y1-Y) : S2=INT(X1-X) : S(S1,S2)=3 : RETURN
  157. 1800 REM SUBROUTINE FOR REPAIRS AFTER TIME (T1-T)
  158. 1810 IF T<0 THEN F9=4 : GOTO 1870
  159. 1820 N=0 :FOR I=0 TO C1-C2 : IF D(I)=<0 THEN 1860
  160. 1830 D(I)=D(I)-(T1-T) : IF D(I)>0 THEN 1860
  161. 1840 IF N=0 THEN PRINT : PRINT "DAMAGE CONTROL REPORTING " : N=Z
  162. 1850 D(I)=0 : PRINT D$(I);"REPAIRED" 
  163. 1860 NEXT
  164. 1870 RETURN
  165. 1900 REM COMPUTER
  166. 1910 IF D(I)>0 THEN PRINT "COMPUTER DOWN AT THIS TIME " : GOTO 1970
  167. 1920 INPUT "Computer WORKING ";A$
  168. 1930 IF LEN(A$)<3 THEN PRINT "THAT DOES NOT COMPUTE (3 letters please) " : PRINT : GOTO 1920
  169. 1940 FOR I=0 TO LEN(C2$)/3-Z : IF A$=MID$(C2$,I*3+Z,3) THEN 1960
  170. 1950 NEXT : FOR I=0 TO LEN(C2$)/3-Z : PRINT MID$(C2$,I*3+Z,3); TAB(8); C3$(I) : NEXT : PRINT : GOTO 1920
  171. 1960 ON I+Z GOSUB 200,170,1980,2060,2360
  172. 1970 RETURN
  173. 1980 REM COMPUTER KLINGON STATUS
  174. 1990 IF D(5)>0 OR D(1)>0 THEN PRINT "COMPUTER/SENSOR MALFUNCTIONING AT THIS TIME " : GOTO 2050
  175. 2000 IF K=0 THEN PRINT "No KLINGONs in Quadrant" : GOTO 2050
  176. 2010 J=0 : X1=S1 : Y1=S2 :: FOR I=0 TO 7 : IF K3(I)=<0 THEN 2040
  177. 2020 IF J=0 THEN PRINT "KLINGON","  ENERGY";TAB(30);"DISTANCE";TAB(40);"DIRECTION" : J=Z
  178. 2030 PRINT K1(I)+Z;",";K2(I)+Z,K3(I); : X=K1(I) : Y=K2(I) : GOSUB 2210 : PRINT TAB(30);X2;TAB(40);Y2
  179. 2040 NEXT
  180. 2050 C9=Z : GOTO 1970
  181. 2060 REM DIRECTION/DISTANCE CALCULATOR 
  182. 2070 INPUT "Quadrant, Sector or Other (Q/S/O) ";A$
  183. 2080 IF LEFT$(A$,Z)="Q" THEN 2120
  184. 2090 IF LEFT$(A$,Z)="S" THEN 2140
  185. 2100 IF LEFT$(A$,Z)="O" THEN 2160
  186. 2110 GOTO 2070
  187. 2120 X1=Q1 : Y1=Q2 : PRINT "YOU ARE IN QUADRANT";Q1+Z;",";Q2+Z
  188. 2130 INPUT "DESTINATION CO-ORDINATES (Row,Column) ";X,Y : X=X-Z : Y=Y-Z : GOTO 2190
  189. 2140 X1=S1 : Y1=S2 : PRINT "YOU ARE IN SECTOR"; S1+Z;",";S2+Z
  190. 2150 INPUT "DESTINATION/TARGET CO-ORDINATES (Row,Column) ";X,Y : X=X-Z : Y=Y-Z : GOTO 2190
  191. 2160 PRINT "YOU ARE IN QUADRANT";Q1+Z;",";Q2+Z,"SECTOR ";S1+Z;","S2+Z
  192. 2170 PRINT : INPUT "INITIAL CO-ORDINATES (Row,Column) ";X1,Y1
  193. 2180 INPUT "DESTINATION CO-ORDINATES (Row,Column) ";X,Y
  194. 2190 PRINT : GOSUB 2210 : PRINT "DISTANCE=";X2, "BEARING=",Y2
  195. 2200 RETURN
  196. 2210 REM DIRECTION/DISTANCE SUBROUTINE
  197. 2220 IF X=X1 AND Y=Y1 THEN X2=0 : Y2=10 : GOTO 2350
  198. 2230 X2=SQR((X1-X)^2+(Y1-Y)^2)
  199. 2240 X=X-X1 : Y=Y-Y1 : IF X=<0 THEN 2260
  200. 2250 IF Y<0 THEN 2280 ELSE 2320
  201. 2260 IF Y=<0 THEN 2310
  202. 2270 Y2=Z : IF X=0 THEN 2350 ELSE 2290
  203. 2280 Y2=5 : IF X=0 THEN 2350
  204. 2290 IF ABS(X)>ABS(Y) THEN Y2=Y2+Z+(Z-(ABS(Y)/ABS(X))) : GOTO 2350
  205. 2300 Y2=Y2+(ABS(X)/ABS(Y)) : GOTO 2350
  206. 2310 Y2=3 : IF Y=0 THEN 2350 ELSE 2330
  207. 2320 Y2=7 : IF Y=0 THEN 2350
  208. 2330 IF ABS(X)<ABS(Y) THEN Y2=Y2+Z+(Z-(ABS(X)/ABS(Y))) : GOTO 2350
  209. 2340 Y2=Y2+(ABS(Y)/ABS(X))
  210. 2350 RETURN
  211. 2360 IF D(1)>0 THEN PRINT D$(1);"are not working" : GOTO 2470
  212. 2370 IF S9=Z THEN 2410 : REM SECTOR/SYSTEM SCAN
  213. 2380 FOR I=0 TO 7 : FOR J=0 TO 7 : S8(I,J)=0 : IF S(I,J)<>2 OR RND(Z)>.05 THEN 2400
  214. 2390 IF RND(Z)<.5 THEN S8(I,J)=99 ELSE S8(I,J)=INT(RND(Z)*8)
  215. 2400 NEXT J : NEXT I : S9=Z
  216. 2410 PRINT : PRINT "SECTOR","SENSOR READING" : PRINT : FOR I=0 TO 7 : FOR J=0 TO 7
  217. 2420 IF S(I,J)<>2 THEN 2460 
  218. 2430 PRINT I+Z;",";J+Z, : IF S8(I,J)=0 THEN PRINT "No significant data" : GOTO 2460
  219. 2440 IF S8(I,J)=99 THEN PRINT "Dilithium Crystal deposits" : GOTO 2460
  220. 2450 PRINT "Class M Planet,  Culture level"; S8(I,J)
  221. 2460 NEXT J : NEXT I : PRINT
  222. 2470 RETURN
  223. 2500 REM VIS VISUAL
  224. 2510 GOSUB 70 : FOR I=S1-2 TO S1+2 : FOR J=S2-2 TO S2+2
  225. 2520 IF I<0 OR I>7 OR J<0 OR J>7 THEN PRINT "$"; : GOTO 2540
  226. 2530 PRINT MID$(S$,S(I,J),Z);
  227. 2540 PRINT " "; : NEXT : PRINT : NEXT : C9=Z : RETURN
  228. 2600 REM RES RESIGN
  229. 2610 IF K>0 THEN PRINT : PRINT "YOUR SURRENDER WILL NOT BE ACCEPTED " :  GOTO 2650
  230. 2620 INPUT "ARE YOU SURE (Yes/No) ";A$ : IF LEN(A$)=0 THEN 2620
  231. 2630 IF LEFT$(A$,Z)="N" THEN 2650
  232. 2640 IF LEFT$(A$,Z)="Y" THEN F9=Z
  233. 2650 RETURN
  234. 2700 REM SHE SHIELDS
  235. 2710 IF C$="DOCKED" THEN PRINT "Regulations forbid raising the shields when docked" : GOTO 2770
  236. 2720 IF D(I)>0 THEN PRINT D$(I)+"DAMAGED" : GOTO 2770
  237. 2730 PRINT D$(I);"currently at";E1;"Units"
  238. 2740 INPUT "How much energy to divert to the shields Sir ";N
  239. 2750 IF N>E THEN PRINT "WE DON'T HAVE THAT MUCH SIR" : GOTO 2740
  240. 2760 E1=N
  241. 2770 RETURN
  242. 2800 REM DAM DAMAGE CONTROL
  243. 2810 GOSUB 70 : D8=0
  244. 2820 FOR I=0 TO C1-C2 : IF D(I)>0 THEN D8=D8+Z 
  245. 2830 NEXT: PRINT : IF D8=0 THEN PRINT : PRINT "ALL SYSTEMS A-OK !": GOTO 2910 
  246. 2840 PRINT "SYSTEM";TAB(28);"ETR" : PRINT
  247. 2850 FOR I=0 TO C1-C2 : IF D(I)>0 THEN PRINT D$(I);TAB(28);INT(D(I)+Z)
  248. 2860 NEXT : IF K>0 THEN 2910
  249. 2870 PRINT :INPUT "HOW MANY DAYS TO SPEND ON REPAIRS SIR ";D8 : IF D8<0 THEN D8=0
  250. 2880 FOR I=0 TO C1-C2 : IF D(I)=0 THEN 2900
  251. 2890 D(I)=D(I)-D8 : IF D(I)=<0 THEN D(I)=0 : PRINT D$(I); "REPAIRED"
  252. 2900 NEXT : T=T-D8
  253. 2910 RETURN
  254. 3000 REM-MAIN LOOP
  255. 3020 IF C9=0 THEN I=Z : IF D(Z)=0 THEN GOSUB 400 ELSE I=11 : GOSUB 2500
  256. 3040 PRINT
  257. 3050 INPUT "COMMAND ";A$ : IF LEN(A$)<3 THEN PRINT "BEG PARDON CAPTAIN (3 letters please) " : GOTO 3050
  258. 3060 FOR I=0 TO LEN(C1$)/3-Z : IF A$=MID$(C1$,(I*3)+Z,3) THEN 3080
  259. 3070 NEXT : FOR I=0 TO C1 : PRINT MID$(C1$,(I*3)+Z,3); TAB(8);D$(I) : NEXT : C9=99 : GOTO 3000
  260. 3080 C9=I : ON I+Z GOSUB 1300,400,300,800,1000,1900,2700,4300,3600,3800,2800,2500,2600,5000,5500,200,1980,2360
  261. 3090 IF F9>0 THEN 9000 ELSE PRINT : IF C9=Z THEN 3110
  262. 3100 IF K>0 THEN GOSUB 700 : GOSUB 600
  263. 3110 IF F9>0 THEN 9000
  264. 3140 GOTO 3000
  265. 3200 REM SUBROUTINE TO SET UP QUADRANT
  266. 3210 FOR I=0 TO 7 : FOR J=0 TO 7 : S(I,J)=Z : NEXT J : NEXT I : S9=0
  267. 3220 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN K=0 : B=0 : S=INT(RND(Z)*1.2) : GOTO 3250
  268. 3230 N=ABS(Q(Q1,Q2)) : K=INT(N/100) : N=N-K*100 : B=INT(N/10)
  269. 3240 S=ABS(Q(Q1,Q2))-(K*100+B*10) 
  270. 3250 GOSUB 50 : S1=X : S2=Y : S(X,Y)=3 : IF B=0 THEN 3270
  271. 3260 GOSUB 50 : IF S(X,Y)<>Z THEN 3260 ELSE S(X,Y)=5
  272. 3270 FOR I=1 TO S : GOSUB 50 : IF S(X,Y)<>Z THEN 3290 ELSE S(X,Y)=2
  273. 3290 NEXT : FOR I=0 TO 7 : K3(I)=0 : NEXT : IF K=0 THEN 3340 
  274. 3300 FOR I=1 TO K
  275. 3310 GOSUB 50 : IF S(X,Y)<>Z THEN 3310 ELSE S(X,Y)=4
  276. 3320 K1(I)=X : K2(I)=Y : K3(I)=RND(Z)*1000 : NEXT : PRINT : FOR I=Z TO 3 : PRINT "RED ALERT      "; : NEXT
  277. 3330 PRINT CHR$(7) : IF E1=0 THEN PRINT "YOU FORGOT TO RAISE YOUR SHIELDS"
  278. 3340 RETURN
  279. 3400 REM SUBROUTINE TO SET UP CONDITION
  280. 3410 FOR I=S1-Z TO S1+Z : FOR J=S2-Z TO S2+Z
  281. 3420 IF I<0 OR I>7 OR J<0 OR J>7 THEN 3440
  282. 3430 IF S(I,J)=5 THEN 3450
  283. 3440 NEXT J : NEXT I : GOTO 3490
  284. 3450 IF C$="DOCKED" THEN GOSUB 90 : GOSUB 3550 : GOTO 3540
  285. 3460 IF K>0 AND RND(Z)<.5 THEN 3490
  286. 3470 PRINT : PRINT D$(6);"LOWERED FOR DOCKING" : GOSUB 3550 : PRINT : PRINT "REPAIRS and REFUELLING completed"
  287. 3480 GOSUB 90 : T=T-.5 : C$="DOCKED": GOTO 3540
  288. 3490 IF K>0 THEN C$="RED" : GOTO 3540
  289. 3500 FOR I=0 TO C1-C2 : IF D(I)>0 THEN C$="YELLOW" : GOTO 3540
  290. 3510 NEXT : IF E=<E0/10 THEN C$="YELLOW" ELSE C$="GREEN"
  291. 3540 RETURN
  292. 3550 REM SUBROUTINE TO REPAIR ALL SUB-SYSTEMS
  293. 3560 FOR I=0 TO C1-C2 : D(I)=0 : NEXT : RETURN
  294. 3600 REM TRANSPORTER
  295. 3610 IF D(I)>0 THEN PRINT D$(I);"INOPERATIVE AT THIS TIME" : GOTO 3730
  296. 3620 IF D(1)>0 THEN PRINT D$(1);"INOPERATIVE, CANNOT LOCK IN ANY CO-ORDINATES" : GOTO 3730
  297. 3630 IF S9=0 THEN PRINT "Quadrant is not scanned" : GOTO 3730
  298. 3640 IF E1>0 THEN PRINT "SHIELDS are up. Transporter will not beam through" : GOTO 3730
  299. 3650 IF K>0 THEN PRINT "KLINGONS will block the Transporter" : GOTO 3730
  300. 3660 INPUT "Destination co-ordinates ";X,Y : IF X<1 OR X>8 OR Y<1 OR Y>8 THEN 3660
  301. 3670 X=X-Z : Y=Y-Z : IF S8(X,Y)=0 THEN PRINT "THERE IS NOTHING AT THOSE CO-ORDINATES" : GOTO 3730
  302. 3680 H=SQR((S1-X)^2+(S2-Y)^2)*10 : IF (E-H)<0 THEN PRINT "We don't have the energy to beam them that far" : GOTO 3730
  303. 3690 E=E-H : IF E<E1 THEN E1=E
  304. 3700 IF S8(X,Y)=99 THEN GOSUB 4000 ELSE GOSUB 4100
  305. 3710 E=E-H : IF E<E1 THEN E1=E
  306. 3720 PRINT : PRINT "Landing Party beamed aboard"
  307. 3730 RETURN
  308. 3800 REM SHUTTLECRAFT
  309. 3810 IF D(I)>0 THEN PRINT D$(I);"INOPERATIVE AT THIS TIME" : GOTO 3920
  310. 3820 IF D(1)>0 THEN PRINT D$(1); "INOPERATIVE, CANNOT LOCATE ANY CO-ORDINATES" : GOTO 3920
  311. 3830 IF S9=0 THEN PRINT "Quadrant is not scanned" : GOTO 3920
  312. 3840 IF E1>0 THEN PRINT "SHIELDS are up. Shuttlecraft will not pass through" : GOTO 3920
  313. 3850 IF K>0 THEN PRINT "KLINGONS will destroy the Shuttlecraft" : GOTO 3920
  314. 3860 INPUT "Destination co-ordinates ";X,Y : IF X<1 OR X>8 OR Y<1 OR Y>8 THEN 3860
  315. 3870 X=X-Z : Y=Y-Z : IF S8(X,Y)=0 THEN PRINT "THERE IS NOTHING AT THOSE CO-ORDINATES" : GOTO 3920
  316. 3880 X1=(SQR((S1-X)^2+(S2-Y)^2))/10 : IF (T-X1*2)<0 THEN PRINT "We don't have that much time left": GOTO 3920
  317. 3890 T1=T : T=T-X1 : GOSUB 1800 : PRINT "Shuttlecraft Gallileo launched" : PRINT
  318. 3900 IF S8(X,Y)=99 THEN GOSUB 4000 ELSE GOSUB 4100
  319. 3910 T1=T : T=T-X1 : GOSUB 1800 : PRINT "Shuttlecraft Gallileo returned"
  320. 3920 RETURN
  321. 4000 REM MINING OPERATION
  322. 4010 PRINT : J=RND(Z)*E0 : PRINT "LANDING PARTY reports that cystals can be mined"
  323. 4020 PRINT "to supply us with";J;"Units per day down here"
  324. 4030 PRINT : INPUT "How many days do they stay down ";N : IF N<0 THEN N=0 
  325. 4040 IF (T-N)<0 THEN PRINT "YOU DON'T HAVE THAT MUCH TIME" : GOTO 4060
  326. 4050 T1=T : T=T-N : E=E+N*J : GOSUB 1800
  327. 4060 RETURN
  328. 4100 REM SPARES/ETC
  329. 4110 J=RND(Z)*S8(X,Y) : PRINT "LANDING PARTY reports that they can locate"
  330. 4120 PRINT "materials to expedite repairs in";J;"Stardates"
  331. 4130 INPUT "How long should they stay there ";X : IF X>J THEN X=J
  332. 4140 IF (T-X)<0 THEN PRINT "YOU DON'T HAVE THAT MUCH TIME" : GOTO 4210
  333. 4150 IF J=X THEN J=E0
  334. 4160 J=X/J : T=T-X : N=0 : FOR I=0 TO C1-C2 : IF D(I)=<0 THEN 4200
  335. 4170 D(I)=D(I)*J : D(I)=D(I)-(T1-T) : IF D(I)>0 THEN 4200
  336. 4180 IF N=0 THEN PRINT : PRINT "DAMAGE CONTROL REPORTING " : N=Z
  337. 4190 D(I)=0 : PRINT D$(I);"REPAIRED"
  338. 4200 NEXT
  339. 4210 RETURN
  340. 4300 REM LONG RANGE PROBE
  341. 4310 IF D(I)>0 THEN PRINT "LAUNCH CONTROL INOPERATIVE AT THIS TIME" : GOTO 4470
  342. 4320 L3=L3+Z : IF L3>7 THEN PRINT " No Probes left...  Sir " : GOTO 4470
  343. 4330 IF K>0 THEN PRINT "You are not allowed to launch a probe during a battle" : GOTO 4470
  344. 4340 PRINT "LRP";L3;"Direction (1-9) "; : INPUT C : IF C=0 THEN 4470
  345. 4350 IF C<Z OR C>9 THEN 4340
  346. 4360 X1=Q1 : Y1=Q2 : X2=Q1+.5 :  Y2=Q2+.5 : T1=T : FOR I=0 TO E0 : T=T-.1
  347. 4370 Y=(C-Z)*.785398 : X=COS(Y) : Y=-SIN(Y)
  348. 4380 X2=X2+Y : Y2=Y2+X : X1=INT(X2) : Y1=INT(Y2)
  349. 4390 IF SQR((X1-Q1)^2+(Y1-Q2)^2)>5 THEN PRINT "Probe out of range" : GOTO  4460
  350. 4400 PRINT X1+Z;",";Y1+Z;" =";
  351. 4410 IF X1<0 OR X1>7 OR Y1<0 OR Y1>7 THEN PRINT "***" : GOTO 4450
  352. 4420 E$=STR$(Q(X1,Y1)) : E$="00"+MID$(E$,2) : PRINT RIGHT$(E$,3) 
  353. 4430 IF D(5)=0 THEN Q(X1,Y1)=ABS(Q(X1,Y1))
  354. 4440 IF RND(Z)<ABS(Q(X1,Y1)+Z)/1000 THEN PRINT "Contact lost with probe" : GOTO 4460
  355. 4450 NEXT
  356. 4460 GOSUB 1800
  357. 4470 RETURN
  358. 4500 REM INITIALISATION SEQUENCE
  359. 4510 Z=1 : S$=".*EKB" : E0=4000 : C1=14 : C2=5
  360. 4520 DIM D(C1),D$(C1),Q(7,7),S(7,7),K1(7),K2(7),K3(7),S8(7,7)
  361. 4530 PRINT "Welcome to  the Starfleet  Academy Command Training"
  362. 4540 PRINT "Simulator. You are assigned the role of the captain"
  363. 4550 PRINT "of the Starship Enterprise."
  364. 4560 PRINT : PRINT "For assistance, type HELP or read the manual"
  365. 4570 D$(0)="WARP ENGINES " : D$(1)="SHORT RANGE SENSORS " : D$(2)="LONG RANGE SENSORS " : D$(3)="PHASERS "
  366. 4580 D$(4)="PHOTON TORPEDOES " : D$(5)="COMPUTER " : D$(6)="SHIELDS " : D$(7)="LONG RANGE PROBES "
  367. 4590 D$(8)="TRANSPORTER " :D$(9)="SHUTTLECRAFT " :D$(10)="DAMAGE CONTROL " :D$(11)="VISUAL " :D$(12)="RESIGN"
  368. 4600 D$(13)="SAVE THE STATE OF THE GAME" : D$(14)="LOAD A SAVED GAME"
  369. 4610 C1$="NAVSRSLRSPHATORCOMSHELRPTRASHUDAMVISRESSAVLSGMAPKSTSCA" : C2$="MAPSTAKSTDIRSCA"
  370. 4620 C3$(0)="MAP" : C3$(1)="STAtus (Score)" : C3$(2)="KLINGON STatus"
  371. 4630 C3$(3)="DIRECTION/DISTANCE calculator" : C3$(4)="Sector/System SCAn"
  372. 4650 RETURN
  373. 4660 C9=0 : K4=0 : K5=0 : F9=0 : G9=0 : K9=0 : B9=0 : L3=0 : GOSUB 3550 
  374. 4670 FOR I=0 TO 7 : FOR J=0 TO 7 : GOSUB 4790 : Q(I,J)=-(K+B+S) : NEXT J : NEXT I
  375. 4710 IF K9>2000 THEN 4740
  376. 4720 GOSUB 50 : IF Q(X,Y)<-9 THEN 4720
  377. 4730 GOSUB 4790 : Q(X,Y)=-(K+B+S) : GOTO 4710
  378. 4740 IF K9/100<30 THEN T=30 ELSE T=K9/100
  379. 4750 T9=T+Z : IF B9=0 THEN GOSUB 50 : Q(X,Y)=Q(X,Y)-10 : B9=10 
  380. 4760 GOSUB 50 : Q1=X : Q2=Y : GOSUB 3200 : GOSUB 90 : E1=E0/10 : GOSUB 3400 : RETURN
  381. 4790 S=INT(RND(Z)*7+Z)
  382. 4800 B=0 : IF RND(Z)<.02 THEN B=10 : B9=B9+B
  383. 4810 K=0 : IF RND(Z)>.06 THEN 4830
  384. 4820 K=INT(RND(Z)*8)*100 : K9=K9+K : K8=K9
  385. 4830 RETURN
  386. 5000 REM SAVE GAME
  387. 5010 PRINT : INPUT "What filename do you want to save the game in ";A$ : IF LEN(A$)=0 THEN 5010
  388. 5020 IF LEN(A$)>8 THEN A$=LEFT$(A$,8)
  389. 5030 A$=A$ +".TRK"
  390. 5040 OPEN "O",#1,A$
  391. 5050 WRITE#1,"G3ZCZ"
  392. 5100 FOR I=0 TO 7 : FOR J=0 TO 7 : WRITE#1, S(I,J),S8(I,J),Q(I,J) : NEXT J : NEXT I
  393. 5130 WRITE#1,E,E1,B,B9,K,K4,K5,K8,K9,Q1,Q2,S,S1,S2,T,T9,X,Y,W,H,N,C$,P,F9,C,G9,S9,C9,D8,L3,X1,X2,Y1,Y2
  394. 5160 FOR I=0 TO 7 : WRITE#1, K1(I),K2(I),K3(I) : NEXT
  395. 5180 FOR I=0 TO C1-C2 : WRITE#1, D(I) : NEXT
  396. 5200 CLOSE#1 : RETURN
  397. 5500 REM RESTORE A SAVED GAME
  398. 5510 PRINT : INPUT "What is the name of the file you saved the game on ";A$ : IF LEN(A$)=0 THEN 5510
  399. 5520 IF LEN(A$)>8 THEN A$=LEFT$(A$,8)
  400. 5530 A$=A$ +".TRK"
  401. 5540 OPEN "I",#1,A$
  402. 5560 INPUT#1, E$ : IF E$<>"G3ZCZ" THEN PRINT "WRONG DATA FILE " GOTO 5700
  403. 5600 FOR I=0 TO 7 : FOR J=0 TO 7 : INPUT#1, S(I,J),S8(I,J),Q(I,J) : NEXT J : NEXT I
  404. 5630 INPUT#1,E,E1,B,B9,K,K4,K5,K8,K9,Q1,Q2,S,S1,S2,T,T9,X,Y,W,H,N,C$,P,F9,C,G9,S9,C9,D8,L3,X1,X2,Y1,Y2
  405. 5660 FOR I=0 TO 7 : INPUT#1, K1(I),K2(I),K3(I) : NEXT
  406. 5680 FOR I=0 TO C1-C2 : INPUT#1, D(I) : NEXT
  407. 5700 CLOSE#1 : RETURN
  408. 6000 REM ERROR TRAPPING ROUTINES
  409. 6010 ON ERROR GOTO 6000
  410. 6020 IF ERR=58 THEN 6150
  411. 6030 IF ERR=61 THEN 6200
  412. 6040 IF ERR=62 THEN 6250
  413. 6050 IF ERR=67 THEN 6300
  414. 6060 IF ERR=53 THEN 6100
  415. 6090 GOTO 9230
  416. 6100 PRINT A$; " IS NOT ON THE DISK" : RESUME 5500
  417. 6150 PRINT "THAT FILE ALREADY EXISTS"
  418. 6160 INPUT "Do you wish to overwrite it (Y or N) ";E$ : IF LEN(E$)=0 THEN 6160
  419. 6170 IF LEFT$(E$,1)="Y" THEN RESUME 5040
  420. 6180 IF LEFT$(E$,1)="N" THEN RESUME 5000 ELSE 6160
  421. 6200 PRINT "DISK IS FULL"
  422. 6210 PRINT "I CAN'T SAVE ANYTHING ON THAT DISK" : RESUME 5000
  423. 6250 PRINT A$;" DOES NOT CONTAIN THE CORRECT FORM OF DATA" : CLOSE#1 : RESUME 5500
  424. 6300 PRINT "THERE ARE TOO MANY FILES ON THE DISK" : GOTO 6210
  425. 9000 REM ENDGAME
  426. 9010 PRINT : ON F9 GOTO 9020,9040,9080,9130,9160
  427. 9020 REM F9=1 RESIGNATION ENDING
  428. 9030 GOTO 9180
  429. 9040 REM F9=2 CREAMED BY KLINGON
  430. 9050 PRINT "THE ENTERPRISE HAS BEEN DESTROYED "
  431. 9060 PRINT "You did not make such a good Captain, did you ? "
  432. 9070 GOTO 9180 
  433. 9080 REM F9=3 RAN OUT OF ENERGY
  434. 9090 PRINT "The Enterprise has run out of energy." : PRINT
  435. 9100 PRINT "You have just condemed yourself and your crew to"
  436. 9110 PRINT "a horrible and un-necessary death."
  437. 9120 GOTO 9180
  438. 9130 REM F9=4 RAN OUT OF TIME
  439. 9140 PRINT "You did not complete your mission in time"
  440. 9150 GOTO 9180
  441. 9160 REM F9=5 PLAYER WON
  442. 9170 PRINT "CONGRATULATIONS you passed your test"
  443. 9180 PRINT : GOSUB 170 : INPUT "Do you want to play again (Yes/No) "; A$ : IF LEN(A$)=0 THEN 9180
  444. 9190 IF LEFT$(A$,Z)="N" THEN 9230
  445. 9200 IF LEFT$(A$,Z)<>"Y" THEN 9180
  446. 9210 REM START NEW GAME
  447. 9220 PRINT CHR$(26): PRINT : PRINT "WAIT FOR IT" : GOSUB 4660 : GOTO 30
  448. 9230 END
  449.